记一次达梦数据库虚拟表SQL优化记录分享

您所在的位置:网站首页 达梦数据库 group by 记一次达梦数据库虚拟表SQL优化记录分享

记一次达梦数据库虚拟表SQL优化记录分享

2023-04-06 02:59| 来源: 网络整理| 查看: 265

前言:

遇到问题不要怕,先看一看。

语句看懂了,创建个索引,优化个处理方式,30S变0.3秒,速度提升90倍。

 

背景:

达梦数据库、督办定制功能的一个查询列表慢(虚拟表)。

语句:

select id as dbrw,hzrwnr,createdate,BB,whbh01,whbh02,whbh03,zkh,ykh,sfyrq,qtkckry,

(

select count (wfrb.requestid)

from workflow_requestbase wfrb

left join formtable_main_279 mt

on wfrb.requestid=mt.requestid

where mt.dbrw=govern_task.id

and currentnodeid=1831

) as dshsl,

case (

select count (wfrb.requestid)

from workflow_requestbase wfrb

left join formtable_main_279 mt

on wfrb.requestid=mt.requestid

where mt.dbrw=govern_task.id

and currentnodeid=1831

) when 0 then 0 else 1 end as dshzt,

jsjbh,id,name,remark,sponsordept,responsible,coordinatordept,sponsor,coordinator,dycfksx,status,cjrbm,HZfgld,HZlxrq,HZwcsx,HZbz,HZxgfj,jgfkpl,CATEGORYID,

(select max(ldzt) from uf_dbfk where taskid=govern_task.id) as ldzt,

(select min(issign) from govern_operator where taskid=govern_task.id) as sfyqs,

status as zt1,(select fkksrq from (select UD.taskid,max(UDT1.fkksrq) as fkksrq from uf_dbfk UD,uf_dbfk_dt1 UDT1 where  UD.id = UDT1.mainid group by UD.taskid) where taskid=govern_task.id) as fkksrq

,(select xcfkrq from (select UD.taskid,max(UDT1.jhldrqhuang) as xcfkrq from uf_dbfk UD,uf_dbfk_dt1 UDT1 where  UD.id = UDT1.mainid group by UD.taskid) where taskid=govern_task.id) as xcfkrq,aenddate,aendtime

from govern_task

where tasktype=0 and status !=4

 

问题:

记一次达梦数据库虚拟表SQL优化记录分享_优化

语句执行需要30S,导致前端查询特别慢。

解读:

查询

  字段。。。。。。。

  子查询1大概是待办数量

  子查询2大概是待办状态

  子查询3取了啥最大值

  子查询4取了啥最小值

  子查询5fk反馈日期

  子查询6xc反馈日期

查询督办任务。

 

测试:子查询语句单独执行测试,都挺快的。

 

记一次达梦数据库虚拟表SQL优化记录分享_子查询_02

 

主查询测试,也很快。

记一次达梦数据库虚拟表SQL优化记录分享_子查询_03

整体分析测试,F9查看(未看出所以然,略过)

记一次达梦数据库虚拟表SQL优化记录分享_字段_04

排除法测试1-去掉子查询1,速度提升30→15

记一次达梦数据库虚拟表SQL优化记录分享_优化_05

排除法测试2-去掉子查询2,速度提升15→0.16

记一次达梦数据库虚拟表SQL优化记录分享_字段_06

初步定位问题,验证问题点,去掉所有子查询,速度提升到0.014

记一次达梦数据库虚拟表SQL优化记录分享_优化_07

锁定定位问题,验证问题点,加回子查询2,速度14S

记一次达梦数据库虚拟表SQL优化记录分享_字段_08

锁定分析问题,去掉其他查询字段,减少影响因素

记一次达梦数据库虚拟表SQL优化记录分享_原语_09

再次F9查看执行分析

mt.dbrw=govern_task.id 这一步代价大,分析可能原因1:dbrw是自定义字段,不是索引字段。 2.子查询重复执行。

 

记一次达梦数据库虚拟表SQL优化记录分享_原语_10

 

优化思路二:增加索引创建索引

表:formtable_main_279  字段:dbrw

语法:create index 索引名 on 表名(sourceid,rightid);

命名:idx_表名_联合索引名字

创建:CREATE INDEX IDX_formtable_main_279_dbrw ON  formtable_main_279(dbrw)

记一次达梦数据库虚拟表SQL优化记录分享_优化_11

执行测试,14S提升为0.3S,速度提升40倍原语句测试,30S提升为0.8S,速度提升35倍

 

优化思路一:尝试优化语句解读语句:

 

select count (wfrb.requestid) from workflow_requestbase wfrb left join formtable_main_279 mt

on wfrb.requestid=mt.requestid where currentnodeid=1831 and  mt.dbrw=govern_task.id

 

查找流程表单:formtable_main_279,对应任务ID,当前节点为1831 的流程数量。

 

优化语句:

记一次达梦数据库虚拟表SQL优化记录分享_字段_12

流程表单增加状态字段,做节点前后的赋值,去掉大表拼接。

select count (mt.requestid) from  formtable_main_279 mt where mt.lczt=1 and  mt.dbrw=govern_task.id

 

历史数据赋值更新:

记一次达梦数据库虚拟表SQL优化记录分享_子查询_13

先查询后更新

记一次达梦数据库虚拟表SQL优化记录分享_子查询_14

再验证

 

记一次达梦数据库虚拟表SQL优化记录分享_字段_15

测试验证:无条件时与优化前结果一致。

记一次达梦数据库虚拟表SQL优化记录分享_优化_16

测试验证:0.36秒提升为0.08秒,速度提升4倍。

记一次达梦数据库虚拟表SQL优化记录分享_子查询_17

原语句测试:0.8S提升为0.3S,速度提升2.5倍。

记一次达梦数据库虚拟表SQL优化记录分享_子查询_18

优化后数据结果与原语句查询结果导出对比测试一致。

 

 

总结:

经过排查定位、创建索引、优化语句。

Select 查询语句由 30.19秒 提升为0.33秒,速度提升了90倍

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3